WKUIDelegate

自定义 WKUIDelegate(Objective-C)

在 macOS 开发中,WKWebView 是一个强大的网页视图组件,它可以用来显示网页内容。要自定义 WKWebView 的行为,比如处理新窗口的打开、JavaScript 的弹窗(如 alertconfirm 等),你需要实现 WKUIDelegate 协议。

Step1. 创建一个类,继承自 NSObject 并实现 WKUIDelegate

首先,创建一个自定义类,该类需要实现 WKUIDelegate 协议。

#import <WebKit/WebKit.h>

@interface CustomWebViewUIDelegate : NSObject <WKUIDelegate>
@end

@implementation CustomWebViewUIDelegate

// 处理 JavaScript 的 alert 弹窗
- (void)webView:(WKWebView *)webView runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(void))completionHandler {
    NSAlert *alert = [[NSAlert alloc] init];
    alert.messageText = message;
    [alert addButtonWithTitle:@"OK"];
    [alert runModal];
    completionHandler();
}

// 处理 JavaScript 的 confirm 弹窗
- (void)webView:(WKWebView *)webView runJavaScriptConfirmPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(BOOL))completionHandler {
    NSAlert *alert = [[NSAlert alloc] init];
    alert.messageText = message;
    [alert addButtonWithTitle:@"OK"];
    [alert addButtonWithTitle:@"Cancel"];
    NSModalResponse response = [alert runModal];
    completionHandler(response == NSAlertFirstButtonReturn);
}

// 处理 JavaScript 的 prompt 弹窗
- (void)webView:(WKWebView *)webView runJavaScriptTextInputPanelWithPrompt:(NSString *)prompt defaultText:(NSString *)defaultText initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(NSString *))completionHandler {
    NSAlert *alert = [[NSAlert alloc] init];
    alert.messageText = prompt;
    
    NSTextField *input = [[NSTextField alloc] initWithFrame:NSMakeRect(0, 0, 200, 24)];
    [input setStringValue:defaultText];
    [alert setAccessoryView:input];
    
    [alert addButtonWithTitle:@"OK"];
    [alert addButtonWithTitle:@"Cancel"];
    
    NSModalResponse response = [alert runModal];
    if (response == NSAlertFirstButtonReturn) {
        completionHandler([input stringValue]);
    } else {
        completionHandler(nil);
    }
}

// 处理新窗口请求
- (WKWebView *)webView:(WKWebView *)webView createWebViewWithConfiguration:(WKWebViewConfiguration *)configuration forNavigationAction:(WKNavigationAction *)navigationAction windowFeatures:(WKWindowFeatures *)windowFeatures {
    if (!navigationAction.targetFrame.isMainFrame) {
        [webView loadRequest:navigationAction.request];
    }
    return nil;
}

@end

Step2. 在你的视图控制器中使用这个自定义的 WKUIDelegate

在你的视图控制器中,创建 WKWebView 实例并将其 UIDelegate 设置为你自定义的类。

#import "ViewController.h"
#import "CustomWebViewUIDelegate.h"

@interface ViewController ()

@property (strong, nonatomic) WKWebView *webView;
@property (strong, nonatomic) CustomWebViewUIDelegate *webViewUIDelegate;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    // 初始化 WKWebView
    WKWebViewConfiguration *configuration = [[WKWebViewConfiguration alloc] init];
    self.webView = [[WKWebView alloc] initWithFrame:self.view.bounds configuration:configuration];
    
    // 设置 UIDelegate
    self.webViewUIDelegate = [[CustomWebViewUIDelegate alloc] init];
    self.webView.UIDelegate = self.webViewUIDelegate;
    
    // 将 WKWebView 添加到视图
    [self.view addSubview:self.webView];
    
    // 加载网页
    NSURL *url = [NSURL URLWithString:@"https://www.example.com"];
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    [self.webView loadRequest:request];
}

@end

通过自定义 WKUIDelegate,你可以完全控制 WKWebView 的用户界面行为,处理 JavaScript 弹窗、创建新窗口等操作。这种方式为你提供了灵活的网页内容显示和交互体验。


本文作者:Maeiee

本文链接:WKUIDelegate

版权声明:如无特别声明,本文即为原创文章,版权归 Maeiee 所有,未经允许不得转载!


喜欢我文章的朋友请随缘打赏,鼓励我创作更多更好的作品!